ECSでEC2インスタンスを利用する際のネットワークモードについて調べてみた
ご機嫌いかがでしょうか、豊崎です。
今回はECSでEC2インスタンスを利用する時のネットワークモードについて調べる機会がありましたので、まとめたいと思います。
今までdefault(bridge)で利用することが多くいまいちわかっていなかったので、脳内整理のためです。
ネットワークモードって何?
ネットワークモードとは、タスク内のコンテナで使用する Docker ネットワーキングモードのことです。
具体的にはAWSマネジメントコンソールのECSタスク定義の、この部分にです。
ネットワークモードの種類
ECS ネットワークモードは以下の4つから選択することができます。
- bridge
- host
- awsvpc
- なし
bridge(default)
- いわゆるDockerのブリッジです
- ECSインスタンス(EC2)の任意のポートをコンテナのポートにマッピングして利用します
- ECSインスタンス(EC2)のENIを複数のタスクが共有で利用します
- ENIを共用で利用するためSecurityGroupも共有で利用をする必要があります
- 1つのECSインスタンス内に役割の違うTaskが存在するときは必要な全てのポートを解放する必要があります
- 通信帯域もタスクで分けあって利用します
- ALBと組み合わせる場合は動的ポートで利用することが多いです。
Dockerのページを参考にすると、こんなイメージ
https://success.docker.com/article/networking
host
- いわゆるDockerのhost
- コンテナでexposeされたポートをECSインスタンス(EC2)でも利用します
- そのため、一つのホストで同じポートを利用するタスクを複数起動することはできません。
awsvpc
ENIがタスク(複数のコンテナの集合)ごとに直接アタッチされます。 以下のような効果が見込まれます。
- タスク間でのポートマッピングの考慮不要
- ENIが独立しているため、ネットワークパフォーマンスの向上が見込める
- ENIごとにSecurityGroupを紐づけられる
- ECSインスタンス本体とタスクでSecurityGroupを分けることも可能
- VPC FlowLogで観測可能
- ALBとNLBにIPターゲットとして登録が可能
一方、ECSインスタンス(EC2)のENI上限には注意が必要です。執筆時点でECSインスタンスに割り当てられるENIの数は2〜15個(インスタンスタイプによって異なる)です。
ECSインスタンス(EC2)が起動したタイミングでECSインスタンス自体にプライマリENIが1つ付与されるので、実質1〜14ENIということになります。
ある程度大きなECSインスタンス(EC2)でかつタスクを決まった個数起動させたい場合にマッチしそうです。
なし
タスク内のコンテナの外部接続がなくなり、ポートマッピングを指定することはできません。 ECSインスタンス(EC2)とディスクマウントして、コンテナで計算させて計算結果のアウトプットなどに使うんでしょうか? ここはあまり調べられてないので、調べる機会があれば別途アウトプットしたいと思います。
さいごに
ふわっとした認識だったECSでEC2インスタンスを利用するときのネットーワークモードを整理してみました。基本ブリッジかawsvpcでいいと思います。ちなみに、Fargateではそもそもawsvpcしか選択できないため上記考慮は不要です。EC2でのECS利用を行う必要があるときにご参考いただければ幸いです。
こちらもご参考ください
HIGOBASHI.AWS 第7回で「低レイヤー視点から読み解くコンテナ入門」を発表しました #higobashiaws